package cn.xzqwjw.taskmanager.utils;

import cn.xzqwjw.taskmanager.common.customEnum.ResponseCodeEnum;
import cn.xzqwjw.taskmanager.common.exception.CustomException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * Map 常用的一些方法
 *
 * @author wjw
 */
@Slf4j
public class MyMapUtil {

  /**
   * 从map中获取指定key的Object类型值，可能有值，可能为null
   *
   * @param map      指定的map
   * @param keyName  指定的 keyName
   * @param flagMust 是否一定要有此key，如果一定要用，但是map中没有就抛出异常，否则返回空值
   */
  public static <T> T getValueObject(Map<String, T> map, String keyName, boolean flagMust) {
    if (map.containsKey(keyName)) {
      return map.get(keyName);
    }
    if (flagMust) {
      throw new CustomException(ResponseCodeEnum.BAD_REQUEST);
    } else {
      return null;
    }
  }

  /**
   * 从map中获取指定key的 Pojo 类型值，可能有值，可能为null
   *
   * @param map      指定的 map
   * @param keyName  指定的 keyName
   * @param flagMust 是否一定要有此key，如果一定要有，但是map中没有就抛出异常，否则返回空值
   */
  public static <T> T getValuePojo(Map<String, ?> map, String keyName, boolean flagMust, Class<T> clazz) {
    if (CollectionUtils.isEmpty(map) || !StringUtils.hasText(keyName)) {
      return null;
    }
    if (map.containsKey(keyName)) {
      String pojoJson = JsonUtil.obj2Json(map.get(keyName));
      return JsonUtil.json2Obj(pojoJson, clazz);
    } else {
      if (flagMust) {
        throw new CustomException(ResponseCodeEnum.BAD_REQUEST);
      } else {
        return null;
      }
    }
  }

  /**
   * 从map中获取指定key的String类型值，可能有值，可能为""
   *
   * @param flagMust 是否一定要有此key，如果一定要但是map中没有就抛出异常，否则返回空值
   */
  public static String getValueStr(Map<?, ?> map, String keyName, boolean flagMust) {
    if (map.containsKey(keyName)) {
      return map.get(keyName).toString();
    } else {
      if (flagMust) {
        throw new CustomException(ResponseCodeEnum.BAD_REQUEST);
      } else {
        return "";
      }
    }
  }

  /**
   * 从map中获取指定key的Integer类型值，可能有值，可能为null
   */
  public static Integer getValueInt(Map<?, ?> map, String keyName, boolean flagMust) {
    if (map.containsKey(keyName)) {
      return ConvertUtil.obj2Int(map.get(keyName));
    } else {
      if (flagMust) {
        throw new CustomException(ResponseCodeEnum.BAD_REQUEST);
      } else {
        return null;
      }
    }
  }

  /**
   * 从map中获取指定key的Long类型值，可能有值，可能为null
   */
  public static Long getValueLong(Map<?, ?> map, String keyName, boolean flagMust) {
    if (map.containsKey(keyName)) {
      return ConvertUtil.obj2Long(map.get(keyName));
    } else {
      if (flagMust) {
        throw new CustomException(ResponseCodeEnum.BAD_REQUEST);
      } else {
        return null;
      }
    }
  }

  /**
   * 从map中获取指定key的Boolean类型值，可能有值，可能为null
   */
  public static Boolean getValueBool(Map<?, ?> map, String keyName, boolean flagMust) {
    if (map.containsKey(keyName)) {
      return Boolean.parseBoolean(map.get(keyName).toString());
    } else {
      if (flagMust) {
        throw new CustomException(ResponseCodeEnum.BAD_REQUEST);
      } else {
        return null;
      }
    }
  }


}
